package com.itxh.mybatis.model;

import com.itxh.mybatis.utils.GenericTokenParser;

/**
 * RawSqlSource会封装配置文件中SQL文本不包含${}或者动态标签的内容
 *
 * 获取SQL语句的时机：只需要一次把SQL语句解析完成，然后封装到BoundSql即可。
 */
public class RawSqlSource implements SqlSource{

    private SqlSource sqlSource;

    public RawSqlSource(SqlNode mixedSqlNode){
        DynamicContext context = new DynamicContext(null);
        // 把SQL语句拼接位一条SQL语句
        mixedSqlNode.apply(context);
        // 再单独解析#{}
        // TODO
        ParameterMappingTokenHandler tokenHandler = new ParameterMappingTokenHandler();
        GenericTokenParser tokenParser = new GenericTokenParser("#{","}",tokenHandler);
        String sql = tokenParser.parse(context.getSql());

        sqlSource = new StaticSqlSource(sql,tokenHandler.getParameterMappings());
    }
    @Override
    public BoundSql getBoundSql(Object param) {
        return sqlSource.getBoundSql(param);
    }
}
